#ifndef TITULO_H_INCLUDED
#define TITULO_H_INCLUDED

#include "auxiliares.h"
#include <iostream>
#include <cassert>
#include <cstdlib>
//~ #include <string>
#include <utility>


using namespace std;

class Titulo{

    public:
    /*Constructor por de titulo*/
    Titulo(Nombre n, Dinero d, Nat cant);

    /*Destructor de cola*/
    ~Titulo();

    /*Cambia la cotización del titulo por uno nuevo*/
    void recotizar(Dinero cot);

    ///OBSERVADORES///
	/*devuele true si subio la cotizacion*/
    bool enAlza();
	/*devuele el nombre del titulo*/
    const Nombre& nombre() const;
	/*devuele la cantidad max de acciones*/
    Nat maxAcciones() const;
    /*devuele la cotizacion de titulo*/
    const Dinero& cotizacion() const;

	//~ ///FUNCION PARA MOSTRAR POR PANTALLA//
    /*muestra la Cola por pantalla*/
    ostream & operator<<(ostream &os) const;

    void mostrar(ostream & os)const;

    //~ ///IGUALDAD OBSERVACIONAL///
//~
    bool operator==(const Titulo& otro) const;
    bool operator!=(const Titulo& otro) const;

	private:

    Nombre nombre_;
    Dinero cotizacion_;
    Nat maxAcciones_;
    bool enAlza_;


};

Titulo::Titulo(Nombre n, Dinero d, Nat cant){
	nombre_ = n;
	cotizacion_ = d;
	maxAcciones_ = cant;
	enAlza_ = true; //Segun la catedra empieza en true

}

Titulo::~Titulo(){

}

void Titulo::recotizar(Dinero cot){

	enAlza_ = (cotizacion_ < cot);
	cotizacion_ = cot;

}


bool Titulo::enAlza(){

    return enAlza_;

}

const Nombre& Titulo::nombre()const{

    return nombre_;

}
Nat Titulo::maxAcciones()const{

    return maxAcciones_;

}

const Dinero& Titulo::cotizacion() const{

    return cotizacion_;
}


bool Titulo::operator==(const Titulo& otro) const {

    bool res;
    res = (nombre_== otro.nombre_) && (enAlza_== otro.enAlza_) ;
    res = res  && (maxAcciones_== otro.maxAcciones_) && (cotizacion_== otro.cotizacion_);
    return res;
}
bool Titulo::operator!=(const Titulo& otro) const {

    bool res;
    res = !((nombre_== otro.nombre_) && (enAlza_== otro.enAlza_) && (maxAcciones_== otro.maxAcciones_) && (cotizacion_== otro.cotizacion_));
    return res;
}

void Titulo::mostrar(ostream &os)const{

	os<< "|Nom:" << nombre_ << ", Cot:" << cotizacion_ << ", MaxAcc: " << maxAcciones_ << ", Alza: " << enAlza_ << "|" <<endl;

}

ostream & Titulo::operator<<(ostream &os) const{
    mostrar(os);
    return os;
}



ostream& operator<<(ostream& out, const Titulo& a){
	a.mostrar(out);
	return out;
};


#endif // TITULO_H_INCLUDED
